# -*- coding: UTF-8 -*-
import os
import shutil
import collections
from tkinter import *
import tkinter.messagebox


def file_find_byName():
    src = src_path.get()
    dest = des_path.get()
    name = file_name.get()
    #     src='C:/Users/xsw-hp/Desktop/Original'
    #     dest='D:/FileCopy'
    #     name='file.txt'

    if os.path.exists(src) == False:
        str = "您输入的文件源路径不存在！"
        tkinter.messagebox.showwarning("File_Copy Demo", str)
        print("您输入的文件源路径不存在！")

    else:
        # 1. 存储源文件夹路径和文件名信息的字典
        fp = collections.OrderedDict()

        # 2. 存储目标文件序号和其在源文件夹中路径信息的字典
        fpp = {}
        count = 0  # 2.1 根据检索顺序自定义的目标文件序号
        s = name.split('.')  # 2.2 将目标文件名与扩展名分开

        # 3. 在原文件夹路径中搜索目标文件
        for dn, dns, fns in os.walk(src):
            for fl in fns:
                if ((os.path.splitext(fl)[0] == s[0]) and (os.path.splitext(fl)[1][1:] == s[1])):
                    if dn not in fp.keys():
                        fp[dn] = []
                        fpp[count] = dn
                        count += 1
                    fp[dn].append(fl)

        # 4. 打印原文件夹不同子目录下的同名目标文件列表
        print('目标文件个数是：{0:^3},具体列表如下图所示：'.format(len(fpp)))

        file_listbox.delete(0, END)
        if len(fpp) > 0:
            str = '目标文件个数是：{0:^3},具体列表如下图所示：'.format(len(fpp))
            file_listbox.insert(END, str)
            i = 0
            for k in fp.keys():
                for ff in fp[k]:
                    item = ('{1:<2}---{0}').format(os.path.join(k, ff), i)
                    file_listbox.insert(END, item)
                i += 1
        else:
            str = "您要查找的目标文件不存在！"
            tkinter.messagebox.showwarning("File_Copy Demo", str)
            print("您要查找的目标文件不存在！")


def file_copy_byName():
    src = src_path.get()
    dest = des_path.get()
    name = file_name.get()

    # 5. 在同名目标文件列表中，选择要进行操作的一个目标文件
    if file_listbox.size() > 1:
        i = 1
        flag = 0
        while i < file_listbox.size():
            if file_listbox.selection_includes(i):
                flag = 1
                break
            i += 1
        if flag == 1:
            print(i)
            str1 = file_listbox.get(i).split('---')[1]
            relative_path = str1[len(src) + 1:-len(name) - 1]

            #           6. 确认目标文件在目标文件夹中的新路径信息
            if len(relative_path) == 0:
                newpath = dest;
            else:
                newpath = os.path.join(dest, relative_path)  # 6.1 文件对应的新文件夹路径

            print('相对路径是: %s' % relative_path)
            print('新的路径 是: %s' % newpath)

            #           7. 从源文件夹到目标文件夹进行目标文件的复制操作
            if os.path.exists(newpath):  # 7.1 若新路径文件夹已经存在
                flag1 = 0
                flag2 = 0
                for dns, dnss, fnss in os.walk(newpath):  # 7.1.1 检索新路径文件夹中是否已经存在目标文件
                    if len(dns) > len(newpath):
                        break
                    for fl in fnss:
                        if (fl == name):
                            flag3 = int(tkinter.messagebox.askokcancel("File_Copy Demo",
                                                                       ('目标文件  “{0}” 已经存在!您确定要覆盖它吗？').format(
                                                                           os.path.join(newpath, fl))))
                            flag2 = 1
                            if flag3 == 0:
                                flag1 = 1
                                str = '您已经取消文件复制！'
                                tkinter.messagebox.showinfo("File_Copy Demo", str)
                                print('您已经取消文件复制！')
                            break;

                    #                             print(('目标文件  “{0}” 已经存在!您确定要覆盖它吗？').format(os.path.join(newpath,fl)))
                    #                             Confirm=input('请输入 “Y/N”:');    #7.1.1.1 是否对新路径文件夹中已经存在目标文件进行覆盖
                    #                             if Confirm=='Y':
                    #                                 flag1=0
                    #                                 flag2=1
                    #                                 break;
                    #                             else:
                    #                                 flag1=1
                    #                                 flag2=1
                    #                                 print('您已经取消文件复制！')
                    #                                 break;
                    if (flag2 == 1):
                        break
                if (flag1 == 0):  # 7.1.2 目标文件的拷贝
                    oldfile = os.path.join(src, name)
                    shutil.copy(str1, newpath)
                    str = '已经复制 目标文件  "' + oldfile + '" 至 "' + newpath + '" 。'
                    tkinter.messagebox.showinfo("File_Copy Demo", str)

            else:  # 7.2 若新路径文件夹还未建立，直接复制目标文件
                os.makedirs(newpath)
                oldfile = os.path.join(src, name)
                shutil.copy(str1, newpath)
                str = '已经复制 目标文件  "' + oldfile + '" 至 "' + newpath + '" 。'
                tkinter.messagebox.showinfo("File_Copy Demo", str)
                print(str)

        else:
            str = "您未选中任何文件！"
            tkinter.messagebox.showwarning("File_Copy Demo", str)
            print(str)

    else:
        str = "您要查找的文件不存在！"
        tkinter.messagebox.showwarning("File_Copy Demo", str)
        print(str)

    # 0. Tkinter客户端界面的结构布局


root = Tk()
root.title("File-Copy-By-Name")
Label(root, width=15, text='文件源路径:', relief=RIDGE).grid(row=0, column=0, sticky=W)
src_path = Entry(root, width=30, relief=RIDGE)
src_path.grid(row=0, column=1, padx=5, pady=3, sticky=W)
Label(root, width=15, text='文件目标路径:', relief=RIDGE).grid(row=1, column=0, sticky=W)
des_path = Entry(root, width=30, relief=RIDGE)
des_path.grid(row=1, column=1, padx=5, pady=3, sticky=W)

Label(root, width=15, text='待搜索文件名:', relief=RIDGE).grid(row=2, column=0, sticky=W)
file_name = Entry(root, width=23, relief=RIDGE)
file_name.grid(row=2, column=1, padx=5, sticky=W)
file_search = Button(root, padx=3, text='搜索', command=file_find_byName)
file_search.grid(row=2, column=1, padx=5, pady=3, sticky=E)

Label(root, width=39, pady=2, text='搜索到的同名文件列表', relief=RIDGE).grid(row=3, column=0, columnspan=2, padx=3, pady=3,
                                                                    sticky=W)
file_copy = Button(root, padx=3, text='复制', command=file_copy_byName)
file_copy.grid(row=3, column=1, padx=5, pady=3, sticky=E)
file_listbox = Listbox(root, width=45, height=5, selectmode=BROWSE, relief=RIDGE)
file_listbox.grid(row=4, column=0, columnspan=2, padx=3, pady=5)

root.mainloop()

# file_copy_byName('C:/Users/xsw-hp/Desktop/Original','D:/FileCopy','finddup.py')   #0. 'file.txt'  'filepath.txt' 'sysTest.py'  'finddup.py'  '新建文本文档.txt'